package com.elka.wdec.utils;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;

/**
 * Generowanie rozwiazan
 * @author michand
 */
public class GeneratorRozwiazan {
    private int minWolumen;
    private int maxWolumen;
    private int krokWolumen;

    private int minJakosc;
    private int maxJakosc;
    private int krokJakosc;

    private int minCena;
    private int maxCena;
    private int krokCena;

    private int minReklama;
    private int maxReklama;
    private int krokReklama;

    private int minKredyt;
    private int maxKredyt;
    private int krokKredyt;

    public GeneratorRozwiazan(int minWolumen, int maxWolumen, int krokWolumen, int minJakosc, int maxJakosc, int krokJakosc, int minCena, int maxCena, int krokCena, int minReklama, int maxReklama, int krokReklama, int minKredyt, int maxKredyt, int krokKredyt) {
        this.minWolumen = minWolumen;
        this.maxWolumen = maxWolumen;
        this.krokWolumen = krokWolumen;
        this.minJakosc = minJakosc;
        this.maxJakosc = maxJakosc;
        this.krokJakosc = krokJakosc;
        this.minCena = minCena;
        this.maxCena = maxCena;
        this.krokCena = krokCena;
        this.minReklama = minReklama;
        this.maxReklama = maxReklama;
        this.krokReklama = krokReklama;
        this.minKredyt = minKredyt;
        this.maxKredyt = maxKredyt;
        this.krokKredyt = krokKredyt;
    }

    public HashMap<Integer, List<Rozwiazanie>> generujRozwiazania(ZyskMinMax zyskMinMax) {
        zyskMinMax.zeroj();
        HashMap<Integer, List<Rozwiazanie>> zbiorRozwiazan = new HashMap<Integer, List<Rozwiazanie>>();
        
        for(int i = 0; i <= 100; i++) {
            zbiorRozwiazan.put(i, new LinkedList<Rozwiazanie>());
        }

        for(int wolumen = minWolumen; wolumen <= maxWolumen; wolumen += krokWolumen) {
            for(int jakosc = minJakosc; jakosc <= maxJakosc; jakosc += krokJakosc) {
                for(int cena = minCena; cena <= maxCena; cena += krokCena) {
                    for(int reklama = minReklama; reklama <= maxReklama; reklama += krokReklama) {
                        for(int kredyt = minKredyt; kredyt <= maxKredyt; kredyt += krokKredyt) {
                            Rozwiazanie rozwiazanie = new Rozwiazanie(wolumen, jakosc, cena, reklama, kredyt);
                            int ryzyko = Funkcje.ryzyko(rozwiazanie);
                            rozwiazanie.setRyzyko(ryzyko / 100.0);
                            double zysk = Funkcje.zysk(rozwiazanie);
                            rozwiazanie.setZysk(zysk);
                            if(wolumen != 0)
                                rozwiazanie.setKosztJednostkowy(StanPoczatkowy.kosztyStale / wolumen + 5+(double)jakosc*0.08);
                            else
                                rozwiazanie.setKosztJednostkowy(StanPoczatkowy.kosztyStale + 5+(double)jakosc*0.08);
                            rozwiazanie.setKosztCalkowity(StanPoczatkowy.kosztyStale + rozwiazanie.getKosztJednostkowy() * wolumen);
                            if(rozwiazanie.dpuszczalne())
                            {
                                zyskMinMax.nowyZysk(zysk);
                                zbiorRozwiazan.get(ryzyko).add(rozwiazanie);
                            }
                        }
                    }
                }
            }
        }
        
        for(int key : zbiorRozwiazan.keySet())
        {
            for(Rozwiazanie rozwiazanie : zbiorRozwiazan.get(key))
            {
                rozwiazanie.setZyskNorm(zyskMinMax.normalizeZysk(rozwiazanie.getZysk()));
            }
        }

        return zbiorRozwiazan;
    }
}
